﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpDbCommonEdit.h"
#include <vector>
#include "ElementId.h"

namespace gcmp
{
    class IDocument;
    class Vector3d;
    class IModelView;
    class IPlane;

    /// \brief 旋转操作的工具类。
    class GCMP_DB_COMMON_EDIT_EXPORT RotateUtils
    {
    public:
#pragma region Static
        /// \brief 对Element围绕旋转中心点按照起终点所对应的角度进行旋转。
        ///
        /// \param pDocument 当前文档。
        /// \param elementIds 被旋转的Element的Id集合。
        /// \param pointOnRotationAxis 旋转轴上点。
        /// \param rotationAxisDirection 旋转轴方向。
        /// \param angleInRadian 旋转角度(弧度制)。
        /// \param pError 返回的操作错误信息。
        /// \return 旋转操作成功则返回true，否则返回false。
        static bool RotateElements(
            IDocument* pDocument, 
            const ElementIdArray& elementIds, 
            const Vector3d& pointOnRotationAxis, 
            const Vector3d& rotationAxisDirection, 
            const double angleInRadian, 
            std::wstring* pError = nullptr);


        /// \brief 判断族Element是否可以进行旋转操作。
        ///
        /// 以下情况下认为将要被旋转的族Element不能支持旋转操作：
        /// 当将要被旋转的Element被固定时;
        ///
        /// \param pDocument 当前文档。
        /// \param elementId 将要被旋转的族Element的Id。
        /// \param pCannotRotatedExplanation 返回不能进行旋转操作的解释信息。
        /// \return 能够进行旋转操作则返回true，否则返回false。
        static bool CanFamilyBeRotated(
            IDocument* pDocument, 
            const ElementId& elementId, 
            std::wstring* pCannotRotatedExplanation = nullptr);

#pragma endregion Static
    };
}
